package com.koi.satoken.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ･ᴗ･
 * @description [Sa-Token代码方式进行配置]
 */
@Configuration
public class KoiSaTokenInterceptor implements WebMvcConfigurer {

    @Value("${koi.filePath}")
    private String baseFilePath;

    /**
     * @description [注册拦截器]
     * 使用后必须携带 Authorization（此名称在yml中可自行配置）- Bearer token值（除非不被拦截，但是获取不到当前会话用户ID）
     * @author ･ᴗ･
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        // 注册登录拦截器
        registry.addInterceptor(new SaInterceptor(handle -> {
            // 白名单
            List<String> ignoreUrls = new ArrayList<>();
            // favicon.ico浏览器标签Logo
            ignoreUrls.add("/favicon.ico");
            // 验证码
            ignoreUrls.add("/captcha/**");
            // 登录，退出登录
            ignoreUrls.add("/auth/**");
            // 测试接口
            // ignoreUrls.add("/koi/**");
            // 上传文件接口
            ignoreUrls.add("/KoiFile/**");
            // Swagger文档
            ignoreUrls.add("/");
            ignoreUrls.add("/swagger-resources/**");
            ignoreUrls.add("/webjars/**");
            ignoreUrls.add("/swagger-ui/**");
            ignoreUrls.add("/v3/api-docs/**");
            ignoreUrls.add("/doc.html");
            ignoreUrls.add("/error");
            ignoreUrls.add("/actuator");
            ignoreUrls.add("/actuator/**");
            // 静态资源
            ignoreUrls.add(baseFilePath + "/**");
            ignoreUrls.add("/**/*.html");
            ignoreUrls.add("/**/*.css");
            ignoreUrls.add("/**/*.js");

            // 除白名单路径外均需要登录认证
            SaRouter.match("/**").notMatch(ignoreUrls).check(r -> StpUtil.checkLogin());
        })).addPathPatterns("/**");

    }

}
